﻿Public Class Landschaftssuchsystem
    Dim StartX, StartY, ZielX, ZielY, Dauer As Integer
    Dim LandschaftID As String
    Dim Wegsucher As New Stack(Of Wegsucher)
    Dim Suchfeld(,) As Integer
    ''' <summary>
    ''' Zuerst auf den Hintersten Punkt ziehen. Der erste Eckpunkt ist das Ziel! Der letzte Eckpunkt ist der Start!
    ''' </summary>
    ''' <remarks></remarks>
    Public WegpunkteX() As Integer = {}
    ''' <summary>
    ''' Zuerst auf den Hintersten Punkt ziehen. Der erste Eckpunkt ist das Ziel! Der letzte Eckpunkt ist der Start!
    ''' </summary>
    ''' <remarks></remarks>
    Public WegpunkteY() As Integer = {}
    Dim WegpunktX As Integer, WegpunktY As Integer
    Dim Wegrichtung As String
    Dim Ini As Boolean = False
    Dim Schlachtfeld As Integer
    ''' <summary>
    ''' Initialisiert das Objekt. Berechnet, alle Bewegungskosten. Anschliessend muss "Ziel" ausgefuehrt werden
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuX As Integer, ByVal neuY As Integer, ByVal neuLandschaft As String, ByVal Schlachtfeld As Integer)
        Me.Schlachtfeld = Schlachtfeld
        LandschaftID = neuLandschaft
        StartX = neuX
        StartY = neuY
        'Das Suchfeld liegt ueberdem reelen Spielfeld der einHauptmenue.FeldbreiteRand ist nicht drinnen
        ReDim Suchfeld(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Hoehe - 1)
        'Alle nichtpassierbaren Landschaften & Felder mit Einheiten <> StartEinheit muessen auf -1 gesetzt werden.
        For X As Integer = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                If Not LandschaftID = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).getID Then
                    Suchfeld(X, Y) = -1
                End If
            Next
        Next
        Suchfeld(StartX, StartY) = 0
        addWegsucher(StartX, StartY, True)
        Ini = True
        Wegsuchen()
        'Jetzt steht in dem Suchfeld all die Zahlen, die die Bewegungskosten fuer das jeweilige Feld sind.  -Fehlerhaft-
    End Sub
    Private Sub Wegsuchen()
        Do
            Dauer += 1
            Dim alteWegsucher As New Stack(Of Wegsucher)
            For I As Integer = 0 To Wegsucher.Count - 1
                alteWegsucher.Push(Wegsucher(I))
            Next
            Wegsucher.Clear()
            For I As Integer = 0 To alteWegsucher.Count - 1
                addWegsucher(alteWegsucher(I).getX, alteWegsucher(I).getY - 1)
                addWegsucher(alteWegsucher(I).getX, alteWegsucher(I).getY + 1)
                addWegsucher(alteWegsucher(I).getX + 1, alteWegsucher(I).getY)
                addWegsucher(alteWegsucher(I).getX - 1, alteWegsucher(I).getY)
            Next
        Loop While Wegsucher.Count > 0
    End Sub
    ''' <summary>
    ''' Fuegt einen neuen Wegsucher hinzu. Es wird geprueft, ob das Feld existiert und ob es frei ist
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Private Sub addWegsucher(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Startfeld As Boolean = False)
        If FeldPruefen(X, Y) = True Then
            If Startfeld = False Then
                If X = StartX And Y = StartY And Ini = True Then Exit Sub
                Dim W As New Wegsucher
                W.setPosition(X, Y, NeueDauer(Dauer, X, Y))
                Wegsucher.Push(W)
                Suchfeld(X, Y) = NeueDauer(Dauer, X, Y)
            Else
                Dim W As New Wegsucher
                W.setPosition(X, Y, NeueDauer(Dauer, X, Y))
                Wegsucher.Push(W)
            End If
        End If
    End Sub
    ''' <summary>
    ''' Fuegt einen alten Wegsucher den Wegsuchern hinzu
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub addWegsucher(ByVal X As Integer, ByVal Y As Integer, ByVal Dauer As Integer)
        Dim W As New Wegsucher
        W.setPosition(X, Y, NeueDauer(Dauer, X, Y))
        Wegsucher.Push(W)
    End Sub

    ''' <summary>
    ''' Prueft, ob das Feld Existiert und ob es frei ist, wenn ja dann True
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function FeldPruefen(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If Objektverwalter.Spielfeld.OnMap(X, Y) Then
            If Suchfeld(X, Y) = 0 Then
                If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).getID = LandschaftID Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Private Function NeueDauer(ByVal Dauer As Integer, ByVal X As Integer, ByVal Y As Integer)
        Return Dauer + 1
    End Function ' U N V O L L S T Ae N D I G ! ! !

    Public Function GetDauer(ByVal X As Integer, ByVal Y As Integer) As Integer
        If Suchfeld(X, Y) = 0 Then
            If X = StartX And Y = StartY Then
                Return 0
            Else
                Return -1
            End If
        Else
            Return Suchfeld(X, Y)
        End If
    End Function
End Class
